<?php

/**
 * 邀请码DS.
 *
 * @author xiaoxia.xu <xiaoxia.xuxx@aliyun-inc.com>
 * @copyright ©2003-2103 phpwind.com
 * @license http://www.windframework.com
 *
 * @version $Id: PwInviteCode.php 19073 2012-10-10 08:33:40Z xiaoxia.xuxx $
 */
class PwInviteCode
{
    /**
     * 根据邀请码获得邀请码信息.
     *
     * @param string $code
     *
     * @return array
     */
    public function getCode($code)
    {
        if (!$code) {
            return array();
        }

        return $this->_getDao()->getCode($code);
    }

    /**
     * 根据创建者ID获得已使用的邀请码列表.
     *
     * @param int $createdUid
     *
     * @return array
     */
    public function getUsedCodeByCreatedUid($createdUid, $limit = 18, $start = 0)
    {
        if (!$createdUid) {
            return array();
        }

        return $this->_getDao()->getUsedCodeByCreatedUid($createdUid, $limit, $start);
    }

    /**
     * 根据用户ID统计该用户邀请的人数.
     *
     * @param int $createdUid
     *
     * @return array
     */
    public function countUsedCodeByCreatedUid($createdUid)
    {
        if (!$createdUid) {
            return 0;
        }

        return $this->_getDao()->countUsedCodeByCreatedUid($createdUid);
    }

    /**
     * 搜索邀请码
     *
     * @param PwInviteCodeSo $condition 搜索条件对象
     * @param int            $limit     搜索的条数
     * @param int            $offset    搜索的开始位置
     *
     * @return array
     */
    public function searchCode(PwInviteCodeSo $condition, $limit = 10, $offset = 0)
    {
        return $this->_getDao()->searchCode($condition->getData(), $limit, $offset);
    }

    /**
     * 根据条件统计邀请码总数.
     *
     * @param PwInviteCodeSo $condition
     *
     * @return int
     */
    public function countSearchCode(PwInviteCodeSo $condition)
    {
        return $this->_getDao()->countSearchCode($condition->getData());
    }

    /**
     * 根据用户ID和时间，查询该用户在该时间点之后已经购买的.
     *
     * @param int $uid  用户ID
     * @param int $time 计算的其实时间
     *
     * @return int
     */
    public function countByUidAndTime($uid, $time)
    {
        return $this->_getDao()->countByUidAndTime($uid, $time);
    }

    /**
     * 添加邀请码
     *
     * @param PwInviteCodeDm $dm 邀请码
     *
     * @return bool
     */
    public function addCode(PwInviteCodeDm $dm)
    {
        if (($r = $dm->beforeAdd()) instanceof PwError) {
            return $r;
        }

        return $this->_getDao()->addCode($dm->getData());
    }

    /**
     * 批量添加邀请码
     *
     * @param array $codeDms 邀请码信息
     *
     * @return bool
     */
    public function batchAddCode($codeDms)
    {
        if (empty($codeDms) || !is_array($codeDms)) {
            return false;
        }
        $data = array();
        foreach ($codeDms as $dm) {
            if (!($dm instanceof PwInviteCodeDm)) {
                return new PwError('USER:invite.data.format.error');
            }
            if (($r = $dm->beforeAdd()) instanceof PwError) {
                return $r;
            }
            $data[] = $dm->getData();
        }

        return $this->_getDao()->batchAddCode($data);
    }

    /**
     * 更新邀请码信息.
     *
     * @param PwInviteCodeDm $dm 邀请码的购买者---当注册用户购买邀请码注册，成功之后更新该邀请码的购买者
     *
     * @return bool
     */
    public function updateCode(PwInviteCodeDm $dm)
    {
        if (($r = $dm->beforeUpdate()) instanceof PwError) {
            return $r;
        }

        return $this->_getDao()->updateCode($dm->code, $dm->getData());
    }

    /**
     * 删除邀请码
     *
     * @param string $code
     *
     * @return bool
     */
    public function deleteCode($code)
    {
        return $this->_getDao()->deleteCode($code);
    }

    /**
     * 批量删除邀请码
     *
     * @param array $cods
     *
     * @return bool
     */
    public function batchDeleteCode($codes)
    {
        return $this->_getDao()->batchDeleteCode($codes);
    }

    /**
     * 批量过滤已经存在的邀请码
     *
     * @param array $codes
     *
     * @return array
     */
    public function fetchCode($codes)
    {
        return $this->_getDao()->fetchCode($codes);
    }

    /**
     * 邀请码DAO.
     *
     * @return PwInviteCodeDao
     */
    private function _getDao()
    {
        return Wekit::loadDao('invite.dao.PwInviteCodeDao');
    }
}
